#include "Client.h"
#include "Server.h"

/**
 * 构造方法。
 * @param server  服务器
 * @param socket  客户端套接字
 */
Client::Client(Server* server, QTcpSocket* socket) :
    mServer(server),
    mSocket(socket) {
    QObject::connect(socket, SIGNAL(readyRead()), SLOT(onReceive()));
}

/**
 * 析构方法。
 */
Client::~Client() {
    mSocket->close();
}

/**
 * 刷新缓冲区。
 */
void Client::flush() {
    mSocket->flush();
}

/**
 * 接收到数据的响应方法。
 */
void Client::onReceive() {
    // 接收数据长度
    qint64 size = 0;
    qint64 read = mSocket->read(reinterpret_cast<char*>(&size), sizeof(size));
    if (read <= 0) {
        return;
    }

    // 接收数据
    char* buffer = new char[static_cast<size_t>(size)];
    read = mSocket->read(buffer, size);
    if (read <= 0) {
        delete[] buffer;
        return;
    }

    // 将数据转换成协议
    ImProtocol* pro = reinterpret_cast<ImProtocol*>(buffer);

    // 处理协议
    mServer->onGetMessageFromClient(pro, this);

    // 释放缓存
    delete[] buffer;
}

/**
 * 写数据。
 * @param data      数据
 * @param dataSize  数据长度
 */
void Client::write(const void* data, qint64 dataSize) {
    mSocket->write(reinterpret_cast<const char*>(data), dataSize);
}
